package com.dc.refactoring._3_重新组织数据._12_ReplaceTypeCodeWithSubClasses.step2;

/**
 * Description: 雇员类
 * @author: gdc
 * @date: 2020/11/30
 * @version 1.0
 */
// 【8】抽象类
public abstract class Employee {

    /**
     * 雇员类型
     */
    // 【6】移除字段
    //private int type;

    /**
     * 工程师
     */
    public static final int ENGINEER = 0;
    /**
     * 推销员
     */
    public static final int SALESMAN = 1;
    /**
     * 经理
     */
    public static final int MANAGER = 2;

    // 【3】将私有化构造器
    //public Employee(int type) {
    //    this.type = type;
    //}
    // 【6】
    //private Employee(int type) {
    //    this.type = type;
    //}



    // 【1】将类型码自我封装
    //int getType(){
    //    return type;
    //}

    // 【7】抽象方法
    abstract int getType();

    // 【2】由于构造器接收类型码作为一个参数，所以需要将其替换为一个工厂函数
    //static Employee create(int type){
    //    return new Employee(type);
    //}

    //
    static Employee create(int type){
        switch (type){
            case ENGINEER:
                return new Engineer();
            default:
                throw new IllegalArgumentException();
        }
    }
}
